/*
 * @Date: 2020-10-05 22:42:08
 * @Author: David
 * @LastEditors: OBKoro1
 * @LastEditTime: 2020-10-06 12:13:26
 * @FilePath: /huanyong-task-01-01/code/demo3.js
 * @Description: someting...
 */
const fp = require('lodash/fp')
const {Maybe ,Container}  = require('./support')

// 练习 1 ： 使用 fp.add(x,y) 和 fp.map(f,x) 创建一个能让 functor 里的值增加的函数 ex1 
let maybe = Maybe.of([5,6,1]);
// 返回函子 数组值元素全部 增加1 后的数组
let ex1 = () => {
    return  maybe.map((value) => {
        return fp.map((item) => {
            // 元素值 +1
            return fp.add(item,1);
        },value)
    })._value;
}
console.log('练习1 => 增加后 `maybe` 数组中的值：',ex1())

// 练习 2 ：实现一个函数 ex2， 能够使用 fp.first 获取列表的第一个元素 
let xs = Container.of(['do','ray','me','fa','so','la','ti','do'])


let ex2 = () => {
    //使用 map函数传入 处理回调，返回新的函子，再取其值
    return xs.map(fp.first)._value;
}
console.log('练习1 => 列表的第一个元素：',ex2())

// 练习 3 实现一个函数 ex3，使用safeProp 和 fp.first 找到user 名字的首字母
let safeProp = fp.curry(function(o,x) {
    return Maybe.of(o[x])
})
let user = {id: 2,name: 'Albert'}
let ex3 = () => {
   //先获取包含 name 值的函子，再经过 fp.first 处理，得到一个包含首字母值的函子
   return safeProp(user,'name').map(fp.first)._value;
}
console.log('练习3 => 获取 user 名字的首字母:',ex3())

// 练习 4 使用 Maybe 重写 ex4 ,不要有 if 语句
let ex4 = function (n){
    return Maybe.of(n).map(parseInt)._value;
}
console.log('练习4 => 使用 Maybe 重写 ex4 将传入的值转化成数值:',ex4('3232'))